<?php
require("app/AppException.php");

require("model/PersonaPlan.php");
require("model/Beneficiario.php");
require("model/Seguro.php");


class class_Asignacion {
	var $personaPlan;
	var $beneficiario;
	var $seguro;

	function __construct() {
		$this->personaPlan = new PersonaPlan();
		$this->beneficiario = new Beneficiario();
		$this->seguro = new Seguro();
	}

	/* _______________________________ LISTADOS INICIALES ____________________________ */

	public function method_getBeneficiarios($params, $error){
		try{
			$idPersonaPlan = $params[0];
			$beneficiarios = $this->beneficiario->getAllForTitular($idPersonaPlan);
			return $beneficiarios;
		}catch(Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al obtener los beneficiarios");
			return $error;
		}
	}

	public function method_getPlanesForTitular($params, $error){
		try{
			$idTitular = $params[0];
			$planesTitular = $this->personaPlan->getAllPlanesForTitular($idTitular);
			return $planesTitular;
		}catch(Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al obtener los planes del titular");
			return $error;
		}
	}

	public function method_getSeguros($params, $error){
		try{
			$seguros = $this->seguro->getAll();
			return $seguros;
		}catch(Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al obtener los planes del titular");
			return $error;
		}
	}

	public function method_getRelaciones($params, $error){
		try{
			$idPersona = $params[0];
			$relaciones = $this->personaPlan->getAllRelations($idPersona);
			return $relaciones;
		}catch(Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al obtener los planes del titular");
			return $error;
		}
	}



	/* _______________________________ ASIGNACION DE PLANES A PERSONAS ____________________________ */

	public function method_getPersonaPlan ($params, $error){
		try{
			$idPersonaPlan = $params[0];
			$personaPlan = $this->personaPlan->getOwn($idPersonaPlan, null);
			return $personaPlan;
		}catch(Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al recuperar una persona-plan");
			return $error;
		}
	}

	public function method_insertPersonaPlan($params, $error){
		try{
			$personaPlan = $params[0];
			if ($this->personaPlan->exists($personaPlan->id_persona, $personaPlan->id_plan)){
				throw new AppException("Ya se ha asignado este plan a la persona seleccionada");
			}
			return $this->personaPlan->insert($personaPlan);
		}catch(AppException $appX){
			$error->SetError(JsonRpcError_Origin_Application, $appX->getMessage());
			return $error;
		}catch (Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al Asignar el plan");
			return $error;
		}
	}

	public function method_editPersonaPlan($params, $error){
		try{
			$personaPlan = $params[0];
			if ($this->personaPlan->exists($personaPlan->id_persona, $personaPlan->id_plan, $personaPlan->id_persona_plan)){
				throw new AppException("Ya se ha asignado este plan a la persona seleccionada");
			}
			return $this->personaPlan->edit($personaPlan);
		}catch(AppException $appX){
			$error->SetError(JsonRpcError_Origin_Application, $appX->getMessage());
			return $error;
		}catch (Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al Asignar el plan");
			return $error;
		}
	}

	public function method_deletePersonaPlan($params, $error){
		try{
			$idPersonaPlan = $params[0];
			return $this->personaPlan->delete($idPersonaPlan);
		}catch (Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al Asignar el plan");
			return $error;
		}
	}



	/* _______________________________ GESTION DE BENEFICIONARIOS _______________________________ */

	public function method_getBeneficiario($params, $error){
		$idBeneficiario = $params[0];
		$beneficiario = $this->beneficiario->getOwn($idBeneficiario, null);
		return $beneficiario;
	}

	public function method_insertBeneficiario($params, $error) {
		try{
			$beneficiario = $params[0];
			if ($this->beneficiario->exists($beneficiario->id_persona_plan, $beneficiario->id_persona)){
				throw new AppException("Esta persona ya ha sido dada de alta para el plan seleccionado");
			}
			if ($this->beneficiario->exceedsMaximumAllowed($beneficiario->id_persona_plan)){
				throw new AppException("Se ha superado la cantidad de beneficiarios permitida para el plan asignado");
			}
			if ($this->beneficiario->exceedsAllowedPercentage($beneficiario->porcentaje, $beneficiario->id_persona_plan)){
				throw new AppException("Se ha superado el porcentaje asignado por el titular");
			}
			return $this->beneficiario->insert($beneficiario);
		}catch(AppException $appX){
			$error->SetError(JsonRpcError_Origin_Application, $appX->getMessage());
			return $error;
		} catch(Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al insertar un beneficiario");
			return $error;
		}
	}

	public function method_editBeneficiario($params, $error) {
		try{
			$beneficiario = $params[0];
			if ($this->beneficiario->exists($beneficiario->id_persona_plan, $beneficiario->id_persona, $beneficiario->id_beneficiario)){
				throw new AppException("Esta persona ya se dió de alta para el plan seleccionado");
			}
			if ($this->beneficiario->exceedsAllowedPercentage($beneficiario->porcentaje, $beneficiario->id_persona_plan, $beneficiario->id_beneficiario)){
				throw new AppException("Se ha superado el porcentaje asignado por el titular");
			}
			return $this->beneficiario->edit($beneficiario);
		}catch(AppException $appX){
			$error->SetError(JsonRpcError_Origin_Application, $appX->getMessage());
			return $error;
		} catch(Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al editar un beneficiario");
			return $error;
		}
	}

	public function method_deleteBeneficiario($params, $error){
		try{
			$idBeneficiario = $params[0];
			return $this->beneficiario->delete($idBeneficiario);
		}catch(AppException $appX){
			$error->SetError(JsonRpcError_Origin_Application, $appX->getMessage());
			return $error;
		}catch (Exception $x){
			$error->SetError(JsonRpcError_Unknown, "Error al Asignar el plan");
			return $error;
		}
	}
}

?>